package com.crungoo.metadatas;

import java.io.IOException;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
import org.springframework.stereotype.Component;

/**
 * @author fujc-dev@qq.com
 * @description TODO
 * @date 2023/6/28 12:54
 */

public class Programs {

	public static void main(String[] args) throws IOException {


		SimpleMetadataReaderFactory simpleMetadataReaderFactory = new SimpleMetadataReaderFactory();
		// 构造一个MetadataReader
		MetadataReader metadataReader = simpleMetadataReaderFactory.getMetadataReader("com.crungoo.service.MyService1");
		// 得到一个ClassMetadata，并获取了类名
		ClassMetadata classMetadata = metadataReader.getClassMetadata();
		System.out.println(classMetadata.getInterfaceNames());
		for (String className : classMetadata.getMemberClassNames()) {
			System.out.println(className);
		}

		System.out.println(classMetadata.getClassName());
		System.out.println();
		// 获取一个AnnotationMetadata，并获取类上的注解信息
		AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();

		//匹配指定的注解名称
		System.out.println(annotationMetadata.hasAnnotation(Component.class.getName()));
		// 会查找注解上的注解
		System.out.println(annotationMetadata.hasMetaAnnotation(Component.class.getName()));
		for (String annotationType : annotationMetadata.getAnnotationTypes()) {
			System.out.println(annotationType);
		}

		//需要注意的是，SimpleMetadataReader去解析类时，使用的ASM技术。
		//
		//为什么要使用ASM技术，Spring启动的时候需要去扫描，如果指定的包路径比较宽泛，
		//那么扫描的类是非常多的，那如果在Spring启动时就把这些类全部加载进JVM了，这样不太好，
		//所以使用了ASM技术。
		//

	}
}
